home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / effect.c next >
C/C++ Source or Header  |  2000-07-07  |  2KB  |  108 lines

  1. /* effect.c */
  2.  
  3. #include <stdio.h>
  4. #include <xsp2lib.h>
  5. #include "main.h"
  6. #include "effect.h"
  7.  
  8.  
  9. #define EFFECT_MAX    32    /* エフェクト最大数 */
  10.  
  11. static EFFECT effect[EFFECT_MAX];    /* ワーク */
  12. static EFFECT *effect_top,    /* 使用中のワークのリスト */
  13.  *effect_null_top;        /* 空のワークのリスト */
  14.  
  15.  
  16.  
  17. /* 初期化関数へのポインタの配列 */
  18. typedef void (*effect_alloc) (EFFECT *);
  19. effect_alloc EffectAllocFunc[] =
  20. {
  21.     EffectAllocExplZako,
  22.     EffectAllocExpl,
  23.     EffectAllocExplPlayer,
  24.     EffectAllocPoints,
  25. };
  26.  
  27. int points_table2[] =
  28. {
  29.     100, 200, 300, 400, 500, 600, 700, 800, 900, 1000,
  30.     1200, 1500, 1800, 2000, 2500, 3000, 4000, 5000, 6000, 7000,
  31.     8000, 9000, 10000, 12000, 15000, 18000, 20000, 25000, 28000, 30000
  32. };
  33.  
  34.  
  35. /* ゲーム開始時に呼ばれる */
  36. void EffectInit (void)
  37. {
  38.     int i;
  39.  
  40.     /* リストをつなげる */
  41.     effect_top = NULL;
  42.     effect_null_top = effect;
  43.     for (i = 0; i < EFFECT_MAX; i++)
  44.         effect[i].next = &effect[i + 1];
  45.  
  46.     effect[EFFECT_MAX - 1].next = NULL;
  47.  
  48.     points_table[0] = 0;    /* 100点 */
  49.     points_table[1] = 1;    /* 200点 */
  50.     points_table[2] = 3;    /* 400点 */
  51.     points_table[3] = 7;    /* 800点 */
  52. }
  53.  
  54.  
  55.  
  56. /* エフェクト出現時に呼ばれる */
  57. void EffectAlloc (short type, short type2, short x, short y)
  58. {
  59.     EFFECT *p;
  60.  
  61.     if (effect_null_top == NULL)
  62.         return;        /* 空きのワークがない(キャラクターオーバー) */
  63.  
  64.     p = effect_null_top;
  65.     effect_null_top = p->next;
  66.     p->next = effect_top;
  67.     effect_top = p;
  68.  
  69.     p->type = type;
  70.     p->type2 = type2;
  71.     p->x = x;
  72.     p->y = y;
  73.  
  74.     /* 関数へのポインタを使って分岐 */
  75.     EffectAllocFunc[p->type] (p);
  76. }
  77.  
  78.  
  79.  
  80. /* 垂直同期ごとに呼ばれる */
  81. void EffectMove (void)
  82. {
  83.     EFFECT *p, *q;
  84.  
  85.     p = effect_top;        /* 現在注目しているワーク */
  86.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  87.     while (p != NULL) {
  88.         /* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  89.         if ((p->func_effect_move) (p)) {    /* 返り値が非0なら消去 */
  90.             if (q == NULL) {    /* リストの一番最初を削除 */
  91.                 effect_top = p->next;
  92.                 p->next = effect_null_top;
  93.                 effect_null_top = p;
  94.                 q = NULL;
  95.                 p = effect_top;
  96.             } else {
  97.                 q->next = p->next;
  98.                 p->next = effect_null_top;
  99.                 effect_null_top = p;
  100.                 p = q->next;
  101.             }
  102.         } else {
  103.             q = p;
  104.             p = p->next;
  105.         }
  106.     }
  107. }
  108.